package de.tu_darmstadt.gdi1.xcom.tests.testcases.tutors;

import static org.junit.Assert.assertEquals;

import java.util.HashMap;

import org.junit.Before;
import org.junit.Test;

import de.tu_darmstadt.gdi1.xcom.tests.adapters.XcomTestAdapterLevel1;

/**
 * 
 * Tests, whether the game implements the check for syntactical correctness the right way.
 * 
 * @author Fabian Vogt, Lukas Schwoebel
 *
 */
public class IsCorrectLevelTest {
		
	private XcomTestAdapterLevel1 testAdapter;
	
	private HashMap<String, Boolean> levels;
	
	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		testAdapter = new XcomTestAdapterLevel1();
		levels = new HashMap<String, Boolean>();
		levels.put("" +
				"########################\n" +
				"#...#....#......+#######\n" +
				"#..##.......########..##\n" +
				"##.#.....#.........#...#\n" +
				"#..#######......#......#\n" +
				"#..#.+++##......####.###\n" +
				"#..###.#######.........#\n" +
				"#..........m...........#\n" +
				"########################\n" +
				"//{mobs}" +
				"//@;9;2;n;50;75;50;50;10\n" +
				"//@;4;3;n;50;75;50;50;10\n" +
				"//@;1;4;n;50;75;50;50;10\n" +
				"//@;11;4;n;50;75;50;50;10\n" +
				"//Z;1;2;n;50;75;50;50;10\n" +
				"//Z;2;2;n;50;75;50;50;10\n" +
				"//Z;17;4;n;50;75;50;50;10\n" +
				"//Z;18;4;n;50;75;50;50;10\n" +
				"//Z;19;4;n;50;75;50;50;10\n" +
				"//Z;20;4;n;50;75;50;50;10\n" +
				"//Z;21;4;n;50;75;50;50;10\n" +
				"//Z;22;4;n;50;75;50;50;10\n" +
				"//{doors}\n" +
				"//0;5;6;6;c\n" +
				"//15;2;16;3;c\n" +
				"//23;6;20;5;c", true);
		levels.put("" +
				"########\n" +
				"#...####\n" +
				"##.##..#\n" +
				"########\n" +
				"//{mobs}\n" +
				"//@;2;1;n;50;75;50;50;10\n" +
				"//Z;1;1;n;50;75;50;50;10", true);
		// invalid characters, humans and aliens are not defined in levelstring
		levels.put("" +
				"#####\n" +
				"##@.#\n" +
				"#.Z.#\n" +
				"##.#'\n" +
				"#####\n" +
				"//{mobs}\n" +
				"//@;3;1;n;50;75;50;50;10\n" +
				"//{doors}\n" +
				"//3;1;3;2;c", false);
		// no player in level (but alien)
		levels.put("" +
				"####\n" +
				"#..#\n" +
				"##.#\n" +
				"####\n" +
				"//{mobs}\n" +
				"//Z;1;1;n;50;75;50;50;10", false);
		// player placed outside of level
		levels.put("" +
				"####\n" +
				"#..#\n" +
				"##.#\n" +
				"####\n" +
				"//{mobs}\n" +
				"//@;10;1;n;50;75;50;50;10", false);
		// zombie placed outside of level
		levels.put("" +
				"####\n" +
				"#..#\n" +
				"##.#\n" +
				"####\n" +
				"//{mobs}\n" +
				"//@;1;1;n;50;75;50;50;10\n" +
				"//Z;13;37;n;50;75;50;50;10", false);
		// two players placed at the same position
		levels.put("" +
				"####\n" +
				"#..#\n" +
				"##.#\n" +
				"####\n" +
				"//{mobs}\n" +
				"//@;1;1;n;50;75;50;50;10\n" +
				"//@;1;1;n;50;75;50;50;10\n" +
				"//{doors}" +
				"//1;2;2;1", false);
		// player and zombie placed at the same position
		levels.put("" +
				"####\n" +
				"#..#\n" +
				"##.#\n" +
				"####\n" +
				"//{mobs}\n" +
				"//@;1;1;n;50;75;50;50;10\n" +
				"//Z;1;1;n;50;75;50;50;10\n" +
				"//{doors}" +
				"//1;2;2;1", false);
	}

	/**
	 * Test method for {@link de.tu_darmstadt.gdi1.xcom.tests.adapters.XcomTestAdapterLevel1#isCorrectLevel()}.
	 */
	@Test
	public final void testIsCorrectLevel() {
		for (String level : levels.keySet()) {
			//this.testAdapter.loadLevelFromString(level);
			assertEquals("Your implementation identified a correct level as incorrect "
					+ "or an incorrect level as correct.\n" + level + "\n", 
					levels.get(level), 
					Boolean.valueOf(this.testAdapter.isCorrectLevel(level)));
		}
	}
}
